package com.linyaonan.leetcode.medium._1004;

/**
 *
 * 给定一个二进制数组 nums 和一个整数 k，如果可以翻转最多 k 个 0 ，则返回 数组中连续 1 的最大个数 。
 *
 *
 *
 * 示例 1：
 *
 * 输入：nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2
 * 输出：6
 * 解释：[1,1,1,0,0,1,1,1,1,1,1]
 * 粗体数字从 0 翻转到 1，最长的子数组长度为 6。
 * 示例 2：
 *
 * 输入：nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
 * 输出：10
 * 解释：[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
 * 粗体数字从 0 翻转到 1，最长的子数组长度为 10。
 *
 *
 * 提示：
 *
 * 1 <= nums.length <= 10^5
 * nums[i] 不是 0 就是 1
 * 0 <= k <= nums.length
 *
 * @author: Lin
 * @date: 2024/10/30
 */
public class MaxConsecutiveOnesIII {

    /**
     * 不定长滑动窗口
     * 当记录的0个数小于等于k时右指针移动，否则左指针移动到下一个0的下一个位置
     * @param nums
     * @param k
     * @return
     */
    public int longestOnes(int[] nums, int k) {
        // 1,1,1,0,0,0,1,1,1,1,0
        int l = 0;
        int r = 0;
        int addZeroCount = 0;
        int result = 0;
        while (l <= r && r < nums.length) {
            int current = nums[r];
            if (current == 0) {
                if (addZeroCount >= k) {
                    while (nums[l] != 0) {
                        l++;
                    }
                    l++;
                    addZeroCount--;
                }
                addZeroCount++;
            }
            result = Math.max(result, r - l + 1);
            r++;
        }

        return result;
    }

}
